import 'package:flutter/material.dart';
import 'package:media_kit/media_kit.dart';
import 'package:qh_music/src/widgets/audio/volume_slider_controller.dart';

class VolumeControllerWidget extends StatelessWidget {
  final Player player;
  final GlobalKey _volumeBtnKey = GlobalKey();

  late final OverlayEntry _volumeOverlayEntry;
  final double _volumeControllerWidth = 200.0;
  final double _volumeControllerHeight = 48.0;

  VolumeControllerWidget({super.key, required this.player}) {
    _volumeOverlayEntry = OverlayEntry(
      opaque: false,
      builder: buildVolumeSliderController,
    );
  }

  /// 构建音量控制器
  Widget buildVolumeSliderController(BuildContext context) {
    // 尝试获取音量按钮的渲染框，用于计算位置。
    final RenderBox? renderBox =
        _volumeBtnKey.currentContext?.findRenderObject() as RenderBox?;
    // 获取渲染框的大小，如果不存在则默认为零。
    final Size size = renderBox?.size ?? Size.zero;
    // 计算音量按钮在屏幕上的绝对位置。
    final Offset? position = renderBox?.localToGlobal(Offset.zero);
    // 计算音量控制器宽度的一半，用于定位控制器。
    final double halfVolumeControllerWidth = _volumeControllerWidth / 2;
    // 根据按钮位置计算控制器的左上角位置。
    double left =
        (position?.dx ?? 0) - halfVolumeControllerWidth + size.width / 2;
    double top = position?.dy ?? 0;
    final halfBoxHeight = size.height / 2;
    // 如果控制器位置过低，则调整其位置以确保其可见性。
    if (top > _volumeControllerWidth + halfBoxHeight) {
      top = top - halfVolumeControllerWidth - halfBoxHeight;
    } else {
      top = top + halfVolumeControllerWidth + halfBoxHeight;
    }

    // 创建并返回音量控制器的UI。
    return Material(
      // 使得Material不阻挡子Widget的事件。
      type: MaterialType.transparency,
      child: GestureDetector(
        // 允许子Widget接收手势事件。
        behavior: HitTestBehavior.translucent,
        child: Stack(
          children: [
            Positioned(
              top: top,
              left: left,
              child: VolumeSliderControllerWidget(
                player: player,
                width: _volumeControllerWidth,
                height: _volumeControllerHeight,
              ),
            ),
          ],
        ),
        onTap: () {
          _volumeOverlayEntry.remove();
        },
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return IconButton(
      key: _volumeBtnKey,
      onPressed: () {
        if (_volumeOverlayEntry.mounted) {
          _volumeOverlayEntry.remove();
        } else {
          Overlay.maybeOf(context)?.insert(_volumeOverlayEntry);
        }
      },
      icon: StreamBuilder(
        stream: player.stream.volume,
        builder: (context, snapshot) => player.state.volume == 0
            ? const Icon(Icons.volume_off)
            : const Icon(Icons.volume_up),
      ),
    );
  }
}
